---
title: SQL分析与打印
sidebar:
  order: 15
---

import LastedDependency from '@/components/LastedDependency.astro';

MyBatis-Plus提供了SQL分析与打印的功能，通过集成`p6spy`组件，可以方便地输出SQL语句及其执行时长。本功能适用于MyBatis-Plus 3.1.0及以上版本。

## p6spy简介

[`p6spy`](https://github.com/p6spy/p6spy) 是一个针对数据库访问进行拦截和记录的工具，它通过代理JDBC驱动程序来工作。这意味着你的应用程序可以像往常一样使用JDBC，而`p6spy`会在幕后记录所有的SQL语句及其执行时间。这对于开发和调试过程中的SQL优化非常有用。

`p6spy`不仅限于记录SQL日志，它还提供了一些高级功能，如：

- **慢SQL检测**：通过配置`outagedetection`和`outagedetectioninterval`，`p6spy`可以记录执行时间超过设定阈值的SQL语句。
- **自定义日志格式**：通过`logMessageFormat`，你可以自定义SQL日志的输出格式，包括时间戳、执行时间、SQL语句等。
- **日志输出控制**：`appender`配置项允许你选择日志输出到控制台、文件或日志系统。

`p6spy`是一个强大的工具，它为MyBatis-Plus用户提供了便捷的SQL分析与打印功能。通过合理配置，你可以在开发和测试阶段有效地监控和优化SQL语句。然而，由于性能损耗，建议在生产环境中谨慎使用。

## 示例工程

为了更好地理解如何使用这一功能，可以参考官方提供的示例工程：

- [mybatis-plus-sample-crud](https://gitee.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-crud)

## 依赖引入

首先，需要在项目中引入`p6spy`依赖。以下是Maven和Gradle两种构建工具的引入方式：

<LastedDependency groupId="p6spy" artifactId="p6spy" />

## 配置

接下来，需要在`application.yml`或`application.properties`中进行相应的配置。

### application.yml

```yaml
spring:
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:h2:mem:test
    # 其他数据库配置...
```

### spy.properties

`p6spy`的配置文件`spy.properties`包含了多个配置项，以下是一些关键配置的示例：

```properties
# 模块列表，根据版本选择合适的配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定义日志格式
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

# 日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

# 取消JDBC驱动注册
deregisterdrivers=true

# 使用前缀
useprefix=true

# 排除的日志类别
excludecategories=info,debug,result,commit,resultset

# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss

# 实际驱动列表
# driverlist=org.h2.Driver

# 开启慢SQL记录
outagedetection=true

# 慢SQL记录标准（单位：秒）
outagedetectioninterval=2
```

## Spring Boot集成

对于Spring Boot项目，可以使用`p6spy-spring-boot-starter`来简化集成过程。

### 依赖

<LastedDependency groupId="com.github.gavlyukovskiy" artifactId="p6spy-spring-boot-starter" />

### 配置

```yaml
decorator:
  datasource:
    p6spy:
      # 日志格式
      log-format: "\ntime:%(executionTime) || sql:%(sql)\n"
      # 自定义日志类
      logging: custom
      custom-appender-class: com.example.testinit.config.StdoutLogger
```

```java
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger {
    public void logText(String text) {
        System.err.println(text);
    }
}
```

更多关于`p6spy-spring-boot-starter`的配置信息，请参考[GitHub](https://github.com/gavlyukovskiy/spring-boot-data-source-decorator)。

## 注意事项

- `driver-class-name`应配置为`p6spy`提供的驱动类。
- `url`前缀应为`jdbc:p6spy`，后跟实际的数据库连接地址。
- 如果打印的SQL为`null`，请在`excludecategories`中增加`commit`。
- 如果批量操作不打印SQL，请去除`excludecategories`中的`batch`。
- 对于批量操作打印重复的问题，请使用`MybatisPlusLogFactory`（3.2.1新增）。
- 请注意，该插件可能会带来性能损耗，不建议在生产环境中使用。

通过以上步骤，你就可以在开发过程中方便地分析和打印SQL语句了。记得根据实际需要调整配置，以达到最佳的使用效果。
